package com.ruoyi.util;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * @Description: 1.实体类与jsonObject互转 
 * @ClassName: EntityToOther
 * @author syc
 * @date: 2022年6月6日 下午5:43:05
 */
public class EntityToOther {
	
	/**
	 * @Description: 将json转为实体类
	 * @author syc
	 * @date: 2022年6月6日 下午5:50:56
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static <T> T jsonToBean(JSONObject json, Class className) {
		return (T) JSONObject.toJavaObject(json, className);
	}
	
	/**
	 * @Description: String类型的JSON字符串转为实体类
	 * @author syc
	 * @date: 2022年6月6日 下午5:50:56
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static <T> T strJsonToBean(String strJson, Class className) {
		return (T) JSONObject.parseObject(strJson, className);
	}

	/**
	 * @Description: 实体类转为String类型的json
	 * @author syc
	 * @param <T>
	 * @date: 2022年6月6日 下午5:50:56
	 */
	public static <T> String strJsonToBean( T t) {
		return  JSONObject.toJSONString(t);
	}

	
	
	
	/**
	 * @Description: ResultSet 转实体类 
	 * @author syc
	 * @date: 2022年6月6日 下午5:47:52
	 * @return List
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static <T> List getBeans(ResultSet resultSet, Class className) {
		List list = new ArrayList();
		Field fields[] = className.getDeclaredFields();
		try {
			while (resultSet.next()) {
				T instance = (T) className.newInstance();
				for (Field field : fields) {
					Object result = resultSet.getObject(field.getName());
					boolean flag = field.isAccessible();
					field.setAccessible(true);
					field.set(instance, result);
					field.setAccessible(flag);
				}
				list.add(instance);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * @Description: ResultSet 转实体类 
	 * @author syc
	 * @date: 2022年6月6日 下午5:49:10
	 * @return T
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static <T> T getBean(ResultSet resultSet, Class className) {
		T instance = null;
		try {
			instance = (T) className.newInstance();
			Field fields[] = className.getDeclaredFields();
			for (Field field : fields) {
				Object result = resultSet.getObject(field.getName());
				boolean flag = field.isAccessible();
				field.setAccessible(true);
				field.set(instance, result);
				field.setAccessible(flag);
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return instance;
	}

	/**
	 * 将resultSet转化为JSONObject
	 * 
	 * @param rs
	 * @return
	 * @throws SQLException
	 * @throws
	 */

	public static JSONObject resultSetToJsonObject(ResultSet rs) throws SQLException {

		// json对象

		JSONObject jsonObj = new JSONObject();

		// 获取列数

		ResultSetMetaData metaData = rs.getMetaData();

		int columnCount = metaData.getColumnCount();

		// 遍历ResultSet中的每条数据

		if (rs.next()) {

			// 遍历每一列

			for (int i = 1; i <= columnCount; i++) {

				String columnName = metaData.getColumnLabel(i);

				String value = rs.getString(columnName);

				jsonObj.put(columnName, value);

			}

		}

		return jsonObj;

	}

	/**
	 * 将resultSet转化为JSON数组
	 * 
	 * @param rs
	 * @return
	 * @throws SQLException
	 */

	public static JSONArray resultSetToJsonArry(ResultSet rs) throws SQLException{
		// json数组
		JSONArray array = new JSONArray();
		// 获取列数

		ResultSetMetaData metaData = rs.getMetaData();

		int columnCount = metaData.getColumnCount();

		JSONObject jsonObj;
		// 遍历ResultSet中的每条数据

		while (rs.next()) {
			jsonObj = new JSONObject();
			// 遍历每一列
			for (int i = 1; i <= columnCount; i++) {
				String columnName = metaData.getColumnLabel(i);
				String value = rs.getString(columnName);
				jsonObj.put(columnName, value);
			}

			array.add(jsonObj);

		}

		return array;

	}

	/**
	 * @Author syc
	 * @Date Created in 2022-08-17 11:12:42
	 * @Description may 转 实体类
	 *  这个是没有问题的,但是在在实际情况中,一般都是 Map<String, String>
	 */
	public static <T> T mapToBean(Class<T> clazz, Map<String, Object> map) {
		if (map == null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		T obj = null;
		try {
			// 使用newInstance来创建对象
			obj = clazz.newInstance();
			// 获取类中的所有字段
			Field[] fileds = clazz.getDeclaredFields();
			for (Field field : fileds) {
				int mod = field.getModifiers();
				// 判断是拥有某个修饰符
				if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
					continue;
				}
				// 当字段使用private修饰时，需要加上
				field.setAccessible(true);
				// 获取参数类型名字
				String filedTypeName = field.getType().getName();
				//获取属性
				//String name = field.getName();
				// 判断是否为时间类型，使用equalsIgnoreCase比较字符串，不区分大小写
				// 给obj的属性赋值
				if (filedTypeName.equalsIgnoreCase("java.util.date")) {
					String datetimestamp = (String) map.get(field.getName());
					if (datetimestamp.equalsIgnoreCase("null")) {
						field.set(obj, null);
					} else {
						field.set(obj, sdf.parse(datetimestamp));
					}
				} else {
					field.set(obj, map.get(field.getName()));
				}
			}
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return obj;
	}

	/**
	 * @Author syc
	 * @Date Created in 2022-08-17 15:02:32
	 * @Description
	 */
	public static <T> T map2ToBean(Class<T> clazz, Map<String, String> map) {
		if (map == null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		T obj = null;
		try {
			// 使用newInstance来创建对象
			obj = clazz.newInstance();
			// 获取类中的所有字段
			Field[] fileds = clazz.getDeclaredFields();
			for (Field field : fileds) {
				int mod = field.getModifiers();
				// 判断是拥有某个修饰符
				if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
					continue;
				}
				// 当字段使用private修饰时，需要加上
				field.setAccessible(true);
				// 获取参数类型名字
				String filedTypeName = field.getType().getName();
				//获取属性
				//String name = field.getName();
				// 判断是否为时间类型，使用equalsIgnoreCase比较字符串，不区分大小写
				// 给obj的属性赋值
				String dataValue = map.get(field.getName());
				if (dataValue != null) {
					if (filedTypeName.equalsIgnoreCase("java.util.date")) {
						if (dataValue.length() <= 10) {
							dataValue = dataValue + " 00:00:00";
						}
						field.set(obj, sdf.parse(dataValue));
					} else if (filedTypeName.equalsIgnoreCase("java.lang.String")) {
						field.set(obj, dataValue);
					} else if (filedTypeName.equalsIgnoreCase("java.lang.Integer") || filedTypeName.equalsIgnoreCase("int")) {
						field.set(obj, Integer.parseInt(dataValue));
					} else if (filedTypeName.equalsIgnoreCase("java.math.BigDecimal")) {
						field.set(obj, new BigDecimal(dataValue));
					} else if (filedTypeName.equalsIgnoreCase("java.lang.Double") || filedTypeName.equalsIgnoreCase("double")) {
						field.set(obj, Double.parseDouble(dataValue));
					} else if (filedTypeName.equalsIgnoreCase("java.lang.Float") || filedTypeName.equalsIgnoreCase("float")) {
						field.set(obj, Float.parseFloat(dataValue));
					} else {
						System.out.println("filedTypeName:" + filedTypeName + "....这个没有配置");
					}
				}else {
					field.set(obj, null);
				}
			}
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return obj;
	}

//	4.JSONObject--->JAVABean
//	User user=JSONObject.toBean(jsonObj,User.class);
//
//	5.JSON字符串--->JSONObject
//	JSONObject jsonObj=JSONObject.fromObject(jsonStr);
//
//	6.JAVABean--->JSONObject
//	JSONObject jsonObj=JSONObject.fromObject(javabean);
//
//	7.强大JSON工具网址
//	http://www.bejson.com/json2javapojo/

	
	
	

}
